package com.hbase.util;

import com.alibaba.fastjson.JSONObject;
import com.hbase.model.InsertHbaseValueDto;

import java.util.List;
import java.util.Map;

/**
 * @program: my-springboot
 * @description: hbaseAdmin工具类
 * @author: zyj
 * @create: 2019-12-13 10:23
 **/
public interface HbaseAdmin {

    /**
     * 创建hbase表和列簇
     * @param tableName   表名
     * @param columnFamily  列簇
     * @return  1：创建成功；0:创建出错；2：创建的表存在
     */
    int createOneTable (String tableName,String... columnFamily);

    /**
     * 插入or更新记录（单行单列族-单列单值)
     * @param tableName          表名
     * @param row           行号  唯一
     * @param columnFamily  列簇名称
     * @param column       列名
     * @param value       列的值
     */
    boolean insertOneColumnRecords(String tableName,String row,String columnFamily,String column,String value);

    /**
     * 查询表中所有数据信息
     * @param tableName 表名
     * @return
     */
    List<Map<String,Object>> selectTableAllDataMap(String tableName);

    /**
     * @Description: 查询所有表名
     * @Param: []
     * @return: java.util.List<java.lang.String>
     * @Author: zyj
     * @Date: 2019/12/13
     */
    List<String> getAllTableNames();

    /**
     * @Description: 同时创建多张表
     * @Param: [tableMap]
     * @return: boolean
     * @Author: zyj
     * @Date: 2019/12/13
     */
    boolean createManyTable(Map<String,List<String>> tableMap);

    /**
     * 插入or 更新记录（单行单列族-多列多值)
     */
    boolean insertManyColumnRecords(InsertHbaseValueDto insertHbaseValueDto);

    boolean insertManyColumnRecords(String tableName, String row, JSONObject jsonObject, String columnFamily);

    /**
    * @Description: 批量插入数据
    * @Param: [insertHbaseValueDtoList, tableName]
    * @return: boolean
    * @Author: zyj
    * @Date: 2019/12/16
    */
    boolean insertManyColumnRecordsList(List<InsertHbaseValueDto> insertHbaseValueDtoList,String tableName);

    /**
     * 根据行号删除表中一条记录
     * @param tableName      表名
     * @param rowNumber 行号
     */
    boolean deleteDataByRowNumber(String tableName,String rowNumber);

    /**
     * 删除指定的列 ->删除最新列,保留旧列。
     * 如 相同的rowkey的name列数据 提交两次数据，此方法只会删除最近的数据，保留旧数据
     * @param tableName          表名
     * @param rowNumber     行号
     * @param columnFamily  列簇
     * @param cloumn        列
     */
    boolean deleteDataByColumn(String tableName,String rowNumber,String columnFamily,String cloumn);

    /**
     * 删除指定的列 ->新旧列都会删除
     * @param tableName          表名
     * @param rowNumber     行号
     * @param columnFamily  列簇
     * @param cloumn        列
     */
    boolean deleteDataByAllcolumn(String tableName,String rowNumber,String columnFamily,String cloumn);

    /**
     * 删除表
     * @param tableName 表名
     */
    boolean  deleteTable(String tableName);

    /**
     * 根据表名和行号查询数据
     * @param tableName  表名
     * @param rowNumber 行号
     * @return
     */
    Map<String,Object> selectOneRowDataMap(String tableName,String rowNumber);

    /**
     * 根据表名和行号查询数据
     * @param tableName  表名
     * @param rowNumber 行号
     * @return
     */
   List<Map<String,Object>> selectRowDataList(String tableName,List<String> rowNumber);


    /**
     * 根据不同条件查询数据
     * @param tableName      表名
     * @param columnFamily   列簇
     * @param queryParam     过滤列集合   ("topicFileId,6282")=>("列,值")
     * @param regex          分隔字符
     * @param bool           查询方式：and 或 or | true : and ；false：or
     *
     * @return
     */
    List<Map<String,Object>> selectTableDataByFilter(String tableName,String columnFamily,List<String> queryParam,String regex,boolean bool);

    /**
     * 分页的根据不同条件查询数据
     * @param tableName         表名
     * @param columnFamily      列簇
     * @param queryParam        过滤列集合   ("topicFileId,6282")=>("列,值")
     * @param regex             分隔字符
     * @param bool              查询方式：and 或 or | true : and ；false：or
     * @param pageSize          每页显示的数量
     * @param lastRow           当前页的最后一行
     * @return
     */
    List<Map<String,Object>> selectTableDataByFilterPage(String tableName,String columnFamily,List<String> queryParam,
                                                                String regex,boolean bool,int pageSize,String lastRow);

    /**
     *  查根据不同条件查询数据,并返回想要的单列 =>返回的列必须是过滤中存在
     * @param tableName         表名
     * @param columnFamily      列簇
     * @param queryParam        过滤列集合   ("topicFileId,6282")=>("列,值")
     * @param regex             分隔字符
     * @param column            返回的列
     * @param bool              查询方式：and 或 or | true : and ；false：or
     * @return
     */
    List<Map<String,Object>> selectColumnValueDataByFilter(String tableName,String columnFamily,List<String> queryParam,
                                                                  String regex,String column,boolean bool);


    List<Map<String,Object>> selectTableAllDataMapPage(String tableName, int pageSize);
    /**
     * 分页查询表中所有数据信息
     * @param tableName     表名
     * @param pageSize      每页数量
     * @param lastRow       当前页的最后一行
     * @return
     */
    List<Map<String,Object>> selectTableAllDataMapPage(String tableName,int pageSize,String lastRow);

    /**
     * 根据表名和列簇查询所有数据
     * @param tableName     表名
     * @param columnFamily  列簇
     * @return
     */
    List<Map<String,Object>> selectTableAllDataMap(String tableName,String columnFamily);

    /**
     * 根据相同行号和表名及不同的列簇查询数据
     * @param tableName     表名
     * @param rowNumber     行号
     * @param columnFamily  列簇
     * @return
     */
    Map<String,Object> selectTableByRowNumberAndColumnFamily(String tableName,String rowNumber,String columnFamily);

    /**
     * 查询某行中单列数据
     * @param tableName       表名
     * @param rowNumber       行号
     * @param columnFamily    列簇
     * @param column          列
     * @return
     */
    String selectColumnValue(String tableName,String rowNumber,String columnFamily,String column);

    /**
     * 统计表中数据总数
     * @param tableName     表名
     * @return
     */
    int getTableDataCount(String tableName);

    /**
     * 统计表和列簇数据总数
     * @param tableName       表名
     * @param columnFamily    列簇
     * @return
     */
    int getTableDataCount(String tableName,String columnFamily);
}
